package com.gkzf.ai.module.crm.service.creditReport;

import com.gkzf.ai.module.crm.controller.admin.creditReport.vo.admittancecondition.CreditReportAdmittanceConditionSaveReqVO;
import com.gkzf.ai.module.crm.controller.admin.creditReport.vo.admittancecondition.QueryLimitVo;
import com.gkzf.ai.module.crm.controller.admin.creditReport.vo.creditreportbasic.CreditReportBasicSaveReqVO;
import com.gkzf.ai.module.crm.controller.admin.creditReport.vo.creditreportdetails.CreditReportDetailsSaveReqVO;
import com.gkzf.ai.module.crm.dal.dataobject.creditReport.CreditReportBasicDO;
import com.gkzf.ai.module.crm.dal.dataobject.creditReport.UserCreditReportAdmittanceConditionDO;
import jakarta.validation.Valid;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;


/**
 * CRM 征信报告对应准入条件 Service 接口
 *
 * @author 国科智飞
 */
public interface CreditReportAdmittanceConditionService {

    /**
     * 创建CRM 征信报告对应准入条件
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    void createCreditReportAdmittanceCondition(Map<String,Object> createReqVO, CreditReportBasicDO creditReportBasicDO,String channelType);

    /**
     * 创建CRM 征信报告对应准入条件
     */
    void createCreditReportAdmittanceCondition(Long creditBasicId);

    /**
     * 分析征信报告
     * @param detailsDO 征信报告详情
     */
    String analysisCreditReport(CreditReportDetailsSaveReqVO detailsDO);

    /**
     * 更新CRM 征信报告对应准入条件
     *
     * @param updateReqVO 更新信息
     */
    void updateCreditReportAdmittanceCondition(@Valid CreditReportAdmittanceConditionSaveReqVO updateReqVO,Integer isSubmitQpCode);


    /**
     * 更新CRM 征信报告对应准入条件
     *
     * @param updateReqVO 更新信息
     */
    void updateCreditReportAdmittanceCondition(CreditReportDetailsSaveReqVO updateReqVO,String idNumber,CreditReportBasicSaveReqVO basicRespVO);

    /**
     * 更新CRM 征信报告对应准入条件
     *
     * @param updateReqVO 更新信息
     */
    void updateCreditReportAdmittanceConditionXml(CreditReportAdmittanceConditionSaveReqVO updateReqVO);

    /**
     * 获得CRM 征信报告对应准入条件
     *
     * @param creditBasicId 编号
     * @return CRM 征信报告对应准入条件
     */
    UserCreditReportAdmittanceConditionDO getCreditReportAdmittanceCondition(Long creditBasicId);

    /**
     * 组装个人征信报告详情 字符串
     * @param detailsDO 征信报告详情
     * @return 字符串个人征信报告详情
     */
    String assemblingPersonalCreditReportDetails(CreditReportDetailsSaveReqVO detailsDO);

    /**
     * 公共方法
     * 解析查询记录
     * @param creditReportQueryJson 查询记录json
     * @param queryLimitWay 查询方式 1 机构查询 2 本人查询
     * @param consumer 消费者
     */
    void analysisQueryRecord(String creditReportQueryJson, Integer queryLimitWay,Consumer<List<QueryLimitVo>> consumer);

    /**
     * 根据用户征信基本信息ID 获取详情ID
     * @param creditBasicId 用户征信基本信息ID
     * @return 基础信息详情ID
     */
    Long getDetailsIdByBasicId(Long creditBasicId);

    /**
     * 根据用户征信基本信息ID 获取准入条件ID
     * @param creditBasicId 基础信息ID
     * @return 用户补充信息ID
     */
    Long getBasicIdByConditionId(Long creditBasicId);

    /**
     * 获得CRM 征信报告对应准入条件贷款目标
     *
     * @param creditBasicId 编号
     * @return CRM 征信报告对应准入条件
     */
    BigDecimal getLoanObjective(Long creditBasicId);

    /**
     *  计算产品对应用户的收入负债比/额度
     * @param creditBasicId 用户基础信息
     * @return 收入负债比json字符串 [{"index":1,"productNo":"CP20250527090831","productRatio":"33","ratio":">=","userRatio":"1.00"}]
     */
    Map<String,String> getIncomeDebtRatio(Long creditBasicId);



}